The Foo#policy method seems ok.
I think the main problem is PolicyX#pass? method.
As it ismethod; at the moment it is exposing too much, to. To use it, you have to know about the collaborators of the PolicyX class.
A good solution could be to inject collaborators when you instantiate the object.
Lets Lets make an example with PolicyC
class PolicyC def initialize(collaborator_a,collaborator_b) @collaborator_a = collaborator_a @collaborator_b = collaborator_b end def pass? @collaborator_a.check? && collaborator_b.check? # end end