aboutsummaryrefslogtreecommitdiffstats
path: root/actionwebservice/lib/action_web_service/struct.rb
diff options
context:
space:
mode:
authorLeon Breedt <bitserf@gmail.com>2005-02-18 23:55:29 +0000
committerLeon Breedt <bitserf@gmail.com>2005-02-18 23:55:29 +0000
commitec03a601811587dd4265667aadd50c101c23b116 (patch)
treeb040f5f1488267b35bc0110efe029a789c3a350b /actionwebservice/lib/action_web_service/struct.rb
parent5760a6cb3e3f3ce3b41c25023f3fbb875590c5bc (diff)
downloadrails-ec03a601811587dd4265667aadd50c101c23b116.tar.gz
rails-ec03a601811587dd4265667aadd50c101c23b116.tar.bz2
rails-ec03a601811587dd4265667aadd50c101c23b116.zip
rename entire package to Action Web Service
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@672 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionwebservice/lib/action_web_service/struct.rb')
-rw-r--r--actionwebservice/lib/action_web_service/struct.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/actionwebservice/lib/action_web_service/struct.rb b/actionwebservice/lib/action_web_service/struct.rb
new file mode 100644
index 0000000000..5420f4cf49
--- /dev/null
+++ b/actionwebservice/lib/action_web_service/struct.rb
@@ -0,0 +1,55 @@
+module ActionWebService
+ # To send structured types across the wire, derive from ActionWebService::Struct,
+ # and use +member+ to declare structure members.
+ #
+ # ActionWebService::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 < ActionWebService::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 ActionWebService::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 ActionWebService::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