| Conditions | 2 | 
| Paths | 2 | 
| Total Lines | 8 | 
| Code Lines | 5 | 
| Lines | 7 | 
| Ratio | 87.5 % | 
| Changes | 0 | ||
| 1 | <?php  | 
            ||
| 17 | public function __set( $attribute, $value )  | 
            ||
| 
                                                                                                    
                        
                         | 
                |||
| 18 | 	{ | 
            ||
| 19 | 		if( is_callable([static::class, $setter= 'set'.implode('',array_map('ucfirst',explode('_',$attribute))),]) ){ | 
            ||
| 20 | return static::$setter($value);  | 
            ||
| 21 | 		}else{ | 
            ||
| 22 | throw new \Exception(static::class.' has no attribute named '.$attribute);  | 
            ||
| 23 | }  | 
            ||
| 24 | }  | 
            ||
| 25 | }  | 
            ||
| 26 | 
Our type inference engine in quite powerful, but sometimes the code does not provide enough clues to go by. In these cases we request you to add a
@returnannotation as described here.