/** * Retrieve $path from $data. * * @param string $path * @param array|object $data * * @return mixed */ public static function get($path, $data) { if (is_string($path) === false) { \Sledgehammer\deprecated('The $path & $data parameters were swapped'); $tmp = $data; $data = $path; $path = $tmp; } $parts = self::parse($path); foreach ($parts as $part) { switch ($part[0]) { case self::TYPE_ANY: if (is_object($data)) { $data = $data->{$part[1]}; } elseif (is_array($data)) { $data = $data[$part[1]]; } else { \Sledgehammer\notice('Unexpected type: ' . gettype($data) . ', expecting an object or array'); return; } break; case self::TYPE_ELEMENT: if (is_array($data) || is_object($data) && $data instanceof ArrayAccess) { $data = $data[$part[1]]; } else { \Sledgehammer\notice('Unexpected type: ' . gettype($data) . ', expecting an array'); return; } break; case self::TYPE_PROPERTY: if (is_object($data)) { $data = $data->{$part[1]}; } else { \Sledgehammer\notice('Unexpected type: ' . gettype($data) . ', expecting an object'); return; } break; case self::TYPE_METHOD: if (is_object($data)) { $data = $data->{$part[1]}(); } else { \Sledgehammer\notice('Unexpected type: ' . gettype($data) . ', expecting an object'); return; } break; case self::TYPE_OPTIONAL: if (is_object($data)) { if (isset($data->{$part[1]})) { $data = $data->{$part[1]}; } else { return; } } elseif (is_array($data)) { if (array_key_exists($part[1], $data)) { $data = $data[$part[1]]; } else { return; } } else { return; } break; case self::TYPE_OPTIONAL_ELEMENT: if (is_array($data) || is_object($data) && ($data instanceof ArrayAccess || $data instanceof SimpleXMLElement)) { if (isset($data[$part[1]])) { $data = $data[$part[1]]; } else { return; } } else { \Sledgehammer\notice('Unexpected type: ' . gettype($data) . ', expecting an array'); return; } break; case self::TYPE_OPTIONAL_PROPERTY: if (is_object($data)) { if (isset($data->{$part[1]})) { $data = $data->{$part[1]}; } else { return; } } else { \Sledgehammer\notice('Unexpected type: ' . gettype($data) . ', expecting an object'); return; } break; case self::TYPE_SUBPATH: if (is_object($data) || is_array($data)) { $items = []; foreach ($data as $key => $item) { $items[$key] = self::get($part[1], $item); } return $items; } else { \Sledgehammer\notice('Unexpected type: ' . gettype($data) . ', expecting an object or array'); return; } break; case self::TYPE_SELF: return $data; default: throw new Exception('Unsupported type: ' . $part[0]); } } return $data; }
/** * Import definitions inside a module. * Uses strict validation rules when the module contains a classes folder. * * @param array $module */ public function importModule($module) { \Sledgehammer\deprecated('importModule is deprecated in favor of importFolder()'); $path = $module['path']; if (file_exists($module['path'] . 'classes')) { $path = $path . 'classes'; $settings = $this->settings; // Strict settings } else { // Disable validations $settings = array('matching_filename' => false, 'mandatory_definition' => false, 'mandatory_superclass' => false, 'one_definition_per_file' => false, 'revalidate_cache_delay' => 20, 'detect_accidental_output' => false); } $this->importFolder($path, $settings); }