@@ -137,25 +137,36 @@ macro_rules! extend_module {
137137
138138#[ macro_export]
139139macro_rules! py_class {
140- ( $ctx: expr, $class_name: expr, $class_base: expr, { $( $name: expr => $value: expr) ,* $( , ) * } ) => {
140+ ( $ctx: expr, $class_name: expr, $class_base: expr, { $( $name: tt => $value: expr) ,* $( , ) * } ) => {
141141 {
142142 let py_class = $ctx. new_class( $class_name, $class_base) ;
143- $(
144- py_class. set_str_attr( $name, $value) ;
145- ) *
143+ $crate:: extend_class!( $ctx, & py_class, { $( $name => $value) ,* } ) ;
146144 py_class
147145 }
148146 }
149147}
150148
151149#[ macro_export]
152150macro_rules! extend_class {
153- ( $ctx: expr, $class: expr, { $( $name: expr => $value: expr) ,* $( , ) * } ) => {
154- let class = $class;
151+ ( $ctx: expr, $class: expr, { $( $name: tt => $value: expr) ,* $( , ) * } ) => {
155152 $(
156- class . set_str_attr ( $ name, $value) ;
153+ $crate :: extend_class! ( @set_attr ( $ctx , $class , $ name, $value) ) ;
157154 ) *
158- }
155+ if $class. slots. borrow( ) . new. is_some( ) {
156+ $class. attributes. borrow_mut( ) . entry( "__new__" . into( ) ) . or_insert_with( || {
157+ $ctx. new_classmethod( $crate:: obj:: objtype:: type_new)
158+ } ) ;
159+ }
160+ } ;
161+
162+ ( @set_attr( $ctx: expr, $class: expr, ( slot $slot_name: ident) , $value: expr) ) => {
163+ $class. slots. borrow_mut( ) . $slot_name = Some (
164+ $crate:: function:: IntoPyNativeFunc :: into_func( $value)
165+ ) ;
166+ } ;
167+ ( @set_attr( $ctx: expr, $class: expr, $name: expr, $value: expr) ) => {
168+ $class. set_str_attr( $name, $value) ;
169+ } ;
159170}
160171
161172#[ macro_export]
0 commit comments