def methods(*args)
args = [ :public ] if args.empty?
raise ArgumentError if args.any?{ |a| ! METHODS_SYMBOLS.include?(a) }
m = []
a = args.include?( :all )
i = ( args.include?( :inherited ) or args.include?( :ancestors ) )
l = ( args.include?( :local ) or args.include?( :no_ancestors ) )
if a
m |= public_instance_methods( true )
m |= private_instance_methods( true )
m |= protected_instance_methods( true )
elsif i and l
m |= public_instance_methods( true ) if args.include?( :public )
m |= private_instance_methods( true ) if args.include?( :private )
m |= protected_instance_methods( true ) if args.include?( :protected )
elsif i
m |= (public_instance_methods( true ) - public_instance_methods( false )) if args.include?( :public )
m |= (private_instance_methods( true ) - private_instance_methods( false )) if args.include?( :private )
m |= (protected_instance_methods( true ) - protected_instance_methods( false )) if args.include?( :protected )
else
m |= public_instance_methods( ! l ) if args.include?( :public )
m |= private_instance_methods( ! l ) if args.include?( :private )
m |= protected_instance_methods( ! l ) if args.include?( :protected )
m
end
end