diff options
Diffstat (limited to 'actionwebservice/lib/action_service/struct.rb')
-rw-r--r-- | actionwebservice/lib/action_service/struct.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/actionwebservice/lib/action_service/struct.rb b/actionwebservice/lib/action_service/struct.rb new file mode 100644 index 0000000000..142127b052 --- /dev/null +++ b/actionwebservice/lib/action_service/struct.rb @@ -0,0 +1,55 @@ +module ActionService + # To send structured types across the wire, derive from ActionService::Struct, + # and use +member+ to declare structure members. + # + # ActionService::Struct should be used in method signatures when you want to accept or return + # structured types that have no Active Record model class representations, or you don't + # want to expose your entire Active Record model to remote callers. + # + # === Example + # + # class Person < ActionService::Struct + # member :id, :int + # member :firstnames, [:string] + # member :lastname, :string + # member :email, :string + # end + # person = Person.new(:id => 5, :firstname => 'john', :lastname => 'doe') + # + # Active Record model classes are already implicitly supported for method + # return signatures. A structure containing its columns as members will be + # automatically generated if its present in a signature. + class Struct + + # If a Hash is given as argument to an ActionService::Struct constructor, + # it can contain initial values for the structure member. + def initialize(values={}) + if values.is_a?(Hash) + values.map{|k,v| send('%s=' % k.to_s, v)} + end + end + + # The member with the given name + def [](name) + send(name.to_s) + end + + class << self + include ActionService::Signature + + # Creates a structure member with the specified +name+ and +type+. Generates + # accessor methods for reading and writing the member value. + def member(name, type) + write_inheritable_hash("struct_members", name => signature_parameter_class(type)) + class_eval <<-END + def #{name}; @#{name}; end + def #{name}=(value); @#{name} = value; end + END + end + + def members # :nodoc: + read_inheritable_attribute("struct_members") || {} + end + end + end +end |