     1:  2:  3:  4:  5:  6:  7:  8:  9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58:

    <?php

    namespace WPGMZA;

    class Table extends Factory
    {
        private $_table_name;
        private $_document;
        private $_element;

        public function __construct($table_name)
        {
            if(empty($table_name))
                throw new \Exception('Invalid table name');

            $this->_table_name = $table_name;

            $this->_document = new DOMDocument();
            $this->loadDocument();
            $this->_element = $this->getElement();
        }

        protected function loadDocument()
        {
            $this->_document->loadHTML('<div data-wpgmza-table/>');
        }

        protected function getElement()
        {
            return $this->_document->querySelector('[data-wpgmza-table]');
        }

        public function __get($name)
        {
            if(isset($this->{"_$name"}))
                return $this->{"_$name"};

            return $this->{$name};
        }

        public function __set($name, $value)
        {
            if(isset($this->{"_$name"}))
                throw new \Exception('Property is read only');

            $this->{$name} = $value;
        }

        public function html()
        {
            return $this->_document->saveInnerBody();
        }

        public function data($params)
        {
            throw new \Exception('Abstract function called');
        }
    }