add BUILDALL support
[gitmo/Role-Tiny.git] / lib / Class / Tiny / Object.pm
index e3e31c7..bf19053 100644 (file)
@@ -2,9 +2,25 @@ package Class::Tiny::Object;
 
 use strictures 1;
 
+our %NO_BUILD;
+our $BUILD_MAKER;
+
 sub new {
   my $class = shift;
-  bless({ @_ }, $class);
+  $NO_BUILD{$class} and
+    return bless({ ref($_[0]) eq 'HASH' ? %{$_[0]} : @_ }, $class);
+  $NO_BUILD{$class} = !$class->can('BUILD') unless exists $NO_BUILD{$class};
+  $NO_BUILD{$class}
+    ? bless({ ref($_[0]) eq 'HASH' ? %{$_[0]} : @_ }, $class)
+    : bless({ ref($_[0]) eq 'HASH' ? %{$_[0]} : @_ }, $class)->BUILDALL;
+}
+
+sub BUILDALL {
+  my $self = shift;
+  $self->${\(($BUILD_MAKER ||= do {
+    require Method::Generate::BuildAll;
+    Method::Generate::BuildAll->new
+  })->generate_method(ref($self)))}(@_);
 }
 
 sub does {